import { LayerEnum, EnvironmentType, PlatformType } from "./IEnum";
import { IStateMachineManager } from "./IStateMachine";
import { IElmentRoot } from "./IRole";
import { IEventHandler } from "./IUtils";

/**游戏管理器 */
export interface IGameManager {}
/**
 * 游戏启动器
 * Tips:可直接调用onRunGame运行游戏，则注意初始化配置及状态机。
 */
export interface IGameStartup {
  /**游戏状态机 */
  stateMachine: IStateMachineManager;
  /**初始化数据配置 */
  onInitialize(): void;
  /**注册游戏状态机 */
  onRegisterGameState(): void;
  /**运行游戏 */
  onRunGame(): void;
  /**暂停游戏 */
  onStopGame(): void;
  /**退出游戏 */
  onExitGame(): void;
}
/**
 * 场景管理器
 * fix:注意单列用法引发问题。
 */
export interface ISceneManager {
  /**
   * 元素更新状态前回调事件
   * TIPS:回调 参数为 IElementRoot
   */
  beforeUpdate: IEventHandler;
  /**
   * 元素更新状态后回调事件
   * TIPS:回调 参数为 IElementRoot
   */
  updated: IEventHandler;

  /**场景初始化 */
  initScene(options: any): void;
  /**获取场景精灵 */
  getSceneSprite(): any;
  /**添加元素至场景 */
  addElementToLayer(sprite: IElmentRoot, posX?: number, posY?: number);
  /**总元素个数 */
  getCount(): number;
  /**获取指定层元素个数 */
  getCount(layer?: LayerEnum): number;
  /**获取所有元素 */
  getElmentList(): Array<IElmentRoot>;
  /**添加经理至场景 */
  addToLayer(sprite: any, layer: LayerEnum, posX?: number, posY?: number);
  /**场景刷新 */
  update(): void;
  /**销毁当前场景 */
  destroy(): void;
  /**移除指定元素 */
  removeSprite(sprite: IElmentRoot): void;
}
/**场景加载器 */
export interface ISceneLoad {
  sceneSprite: any;
  /**场景加载 */
  load();
}
/**
 * 资源计数器
 * TIPS:统计资源加载完成情况
 */
export interface IProgressManager {
  /**进度值 */
  max: number;
  /**进度增加 */
  add(num?: number);
  /**设置固定进度 如20%，将与add进度相加 */
  setFixed(num?: number);
  /**
   * 绑定完成进度函数
   * @param listener 监听函数 无参
   * @param caller 作用域
   */
  bindCompelet(listener: Function, caller?: any);
  /**
   * 绑定实时进度函数
   * @param listener 监听函数 参数：（cur）cur 代表当前进度
   * @param caller 作用域
   */
  bindProgress(listener: Function, caller?: any);
}
/**音效管理器 */
export interface ISoundManager {
  /**
   * 注册音效
   * @param soundEnum 音效类型枚举
   * @param source 音效来源
   */
  registerSound(soundEnum: number, source: string);
  /**
   * 加载音效
   * @param listener 监听函数
   * @param caller 作用域
   */
  loadSoud(listener: Function, caller?: any);
  /**
   * 注册背景音乐
   * @param soundEnum 音效类型枚举
   * @param source 音效来源
   */
  registerMusic(soundEnum: number, source: string);
  /**
   * 播放音效
   * @param soundEnum 音效类型枚举
   * @param loop  播放次数 0代表无限循环
   * @returns 播放音效。
   */
  play(soundEnum: number, loop?: number, compelet?): any;
  /**停止播放指定类型枚举的音效 */
  stop(soundEnum: number);
  /**清空所有音效 */
  clear();
  /**释放音效-局部音效时使用 */
  destory();
}
/**游戏运行环境 */
export interface IGameEnvironment {
  /**运行环境 */
  environment: EnvironmentType;
  /*运营商 */
  platformType: PlatformType;
  /**接口地址 */
  urlAPI: string;
  /**数据资源地址 */
  urlResouce: string;
  /**初始化环境 */
  InitEnvironment();
}
/**屏幕适配接口 */
export interface IScreenAdaptive {
  /**场景适配-刘海适配，自适应适配等 */
  sceneAdaptive(scene: any);
}
/**本地数据存储器接口 */
export interface ILocalStorage {
  /**
   * 数据列表。
   */
  items: any;
  /**
   * 表示是否支持  <code>LocalStorage</code>。
   */
  support: boolean;
  /**
   * 存储指定键名和键值，字符串类型。
   * @param key 键名。
   * @param value 键值。
   */
  setItem(key: string, value: string): void;
  /**
   * 获取指定键名的值。
   * @param key 键名。
   * @return 字符串型值。
   */
  getItem(key: string): string;
  /**
   * 存储指定键名及其对应的 <code>Object</code> 类型值。
   * @param key 键名。
   * @param value 键值。是 <code>Object</code> 类型，此致会被转化为 JSON 字符串存储。
   */
  setJSON(key: string, value: any): void;
  /**
   * 获取指定键名对应的 <code>Object</code> 类型值。
   * @param key 键名。
   * @return <code>Object</code> 类型值
   */
  getJSON(key: string): any;
  /**
   * 删除指定键名的信息。
   * @param key 键名。
   */
  removeItem(key: string): void;
  /**
   * 清除本地存储信息。
   */
  clear(): void;
}
/**释放资源接口 */
export interface IDispose {
  dispose(disposing?: boolean);
}
